/**
 * @FilePath     : /src/lgmg_robots/agv_navigation/agv_navigate/agvNavigate/helpSrc/check_manager.cpp
 * @Description  : CheckManager类实现了一系列用于路径和进度检查的功能。
 *                 该类包括更新进度数据、添加新路径、设置启用状态、清除检查缓冲区、
 *                 初始化、处理路标缺失触发以及检查超限事件等方法。
 *                 每个方法通过调用内部的mark_check_和dis_check_对象来实现具体的功能。
 *                 该类的设计目的是确保路径和进度的标记与距离检查通过预定义的条件。 
 * @Author       : xiujun.yang
 * @Version      : 1.0.0
 * @LastEditors  : haibo haibo.yang@lgmgim.cn
 * @LastEditTime : 2024-12-19 18:46:55
 * @Copyright (c) 2024 by 临工智能信息科技有限公司, All Rights Reserved. 
**/
#include "check_manager.h" 

CheckManager::CheckManager() : init_(false) {}

/**
 * @brief 更新进度运行数据
 *
 * 该函数用于更新进度运行数据，包括进度节点和进度百分比等信息。
 *
 * @param from_node 起始节点编号
 * @param to_node 结束节点编号
 * @param abs_progress 绝对进度值
 * @param prog_percent 进度百分比
 */
void CheckManager::UpdateProgRunData(USHORT from_node, USHORT to_node,
                                     float abs_progress, float prog_percent) 
{
    mark_check_.UpdateProgRunData(from_node, to_node, abs_progress, prog_percent);
    dis_check_.UpdateProgRunData(from_node, to_node, abs_progress);
}

/**
 * @brief 添加新路径
 *
 * 添加一条新的路径，并检查路径的标记和距离是否满足要求。
 *
 * @param path 指向要添加的路径的指针
 * @param traj 指向路径对应的轨迹的指针
 *
 * @return 如果路径的标记和距离检查都通过，则返回 true；否则返回 false
 */
bool CheckManager::AddNewPath(Path* path, Trajectory* traj) 
{
    bool ret1 = mark_check_.AddNewPath(path, traj);
    bool ret2 = dis_check_.AddNewPath(path, traj);
    return ret1 && ret2;
}

/**
 * @brief 设置检查管理器是否启用
 *
 * 设置 CheckManager 对象的启用状态。
 *
 * @param enable 是否启用，true 表示启用，false 表示禁用
 */
void CheckManager::SetEnable(bool enable) 
{
    mark_check_.SetEnable(enable);
    dis_check_.SetEnable(enable);
}

/**
 * @brief 清除检查缓冲区
 *
 * 该函数用于清除 CheckManager 类中的检查缓冲区，包括标记检查和距离检查两个部分的缓冲区。
 */
void CheckManager::ClearCheckBuffer() 
{
    mark_check_.ClearCheckBuffer();
    dis_check_.ClearCheckBuffer();
}

/**
 * @brief 初始化CheckManager
 *
 * 初始化CheckManager对象，包括mark_check_和dis_check_的初始化。
 *
 * @return 如果初始化成功，则返回true；否则返回false。
 */
bool CheckManager::Init() 
{
    if (init_) {
        DEBUG_OUT("CheckManager init finish before ");
        return true;
    }
    bool ok1 = mark_check_.Init();
    bool ok2 = dis_check_.Init();
    init_ = ok1 && ok2;
    DEBUG_OUT("MarkCheck init finish first:init_ = " << init_ 
                << ", mark check init = " << ok1 
                << ", dis mark init = " << ok2);
    return init_;
}

/**
 * @brief 路标缺失触发
 *
 * 该函数用于路标缺失的触发事件。
 *
 * @param miss_id 缺失的触发事件的唯一标识符
 *
 * @return 如果成功标记，则返回 true；否则返回 false
 */
bool CheckManager::MarkMissTrigger(std::string& miss_id) 
{
    return mark_check_.Trigger(miss_id);
}

/**
 * @brief 检查是否触发超过限制的事件
 *
 * 该函数用于检查是否触发了超过限制的事件，并将结果返回。
 *
 * @param msg 传入的消息字符串，用于检查是否触发超过限制的事件
 * @return 如果触发超过限制的事件，则返回true；否则返回false
 */
bool CheckManager::DisOverLimitTrigger(std::string& msg) 
{
    return dis_check_.Trigger(msg);
}
